package com.nuanshui.heatedloan.fund.biz.dal.mapper;

import com.nuanshui.heatedloan.fund.form.UserAccountBillForm;
import com.nuanshui.heatedloan.fund.form.UserBillInfoForm;
import com.nuanshui.heatedloan.fund.model.BatchPayNum;
import com.nuanshui.heatedloan.fund.model.UserAccountBill;
import com.nuanshui.heatedloan.fund.vo.UserAccountBillVO;
import com.nuanshui.heatedloan.fund.vo.UserBillInfoVO;
import com.nuanshui.heatedloan.pageable.Pager;
import org.apache.ibatis.annotations.Param;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;


public interface UserAccountBillMapper {

	/**
	 * 获取账单列表(借款、还款)
	 * @param pager
	 * @param userBillInfoForm
	 * @return
	 */
	List<UserBillInfoVO> loadlist(Pager<UserBillInfoVO> pager , UserBillInfoForm userBillInfoForm);

	/**
	 *
	 * @param userBillInfoForm
	 * @return
	 */
	List<UserBillInfoVO> loadSum(UserBillInfoForm userBillInfoForm);

	/**
	 *
	 * @param userBillInfoForm
	 * @return
	 */
	List<UserBillInfoVO> loadCount(UserBillInfoForm userBillInfoForm);


	List<UserAccountBill> findUserAccountBill(@Param("userId") String userId, @Param("pager") Pageable pager);
	
	List<UserAccountBill> findUserAccountBillByType(@Param("type") Integer type, @Param("userId") String userId, @Param("pager") Pageable pager);

	List<UserAccountBill> findUserAccountBillByTypes(@Param("types") List<String> types, @Param("userId") String userId, @Param("pager") Pageable pager);

	UserAccountBill findBillDetail(@Param("billId") String billId);
	
	/**
	 * 插入一条账单记录
	 * @author Junyan2015
	 * @date 2016年3月4日 下午2:35:54
	 * @since 2.4.0
	 */
    void insertBillRecord(UserAccountBill userAccountBill);
	
	List<UserAccountBill> findAllUserAccountBill(@Param("pager") Pageable pager);
	
	/**
	 * 查询所有审核中的数据
	 * @author Junyan2015
	 * @date 2016年2月18日 下午4:32:13
	 * @param pager
	 * @return
	 */
    List<UserAccountBill> findAllUserAccountBillInReview(@Param("pager") Pageable pager);
	
	List<UserAccountBill> findAllUserAccountBillByType(@Param("type") Integer type, @Param("pager") Pageable pager);
	
	List<UserAccountBill> findAllUserAccountBillByTypes(@Param("types") List<Integer> types, @Param("pager") Pageable pager);

	UserAccountBill findSuccessAccountBillByPayNum(@Param("dealNum") String dealNum);

	void updateUserAccountBillStatus(@Param("billId") String billId, @Param("status") Integer status);

	void updateStatusByDealNum(@Param("dealNum") String dealNum, @Param("status") Integer status,@Param("subStatus") Integer subStatus);

	/**
	 * 获取当前最大的交易数
	 * @param day
	 * @return
	 */
    Long findMaxDealNumByDay(@Param("day") String day, @Param("bizType") String bizType);
	
	/**
	 * 增加当前最大的交易数
	 * @param day
	 * @return
	 */
    Long incrDealNumByDay(@Param("day") String day, @Param("bizType") String bizType);
	
	/**
	 * 生成某天的第一个订单数
	 * @param day
	 * @return
	 */
    Long insertDealNum(@Param("day") String day, @Param("bizType") String bizType);
	
	/**
	 * 修改用户账单资金流动的平台
	 * @param 
	 * @author guohao
	 * @date 2016年2月23日 下午2:48:45
	 */
    void updateAccountBillPlatfrom(@Param("platform") String platform, @Param("id") String id);
	
	
	
	UserAccountBill loadByDealNum(@Param("dealNum") String dealNum);
	
	/**
	 * 获取用户收益账单
	 * @author fuxinlin
	 * @date 2016年5月4日上午10:20:44
	 * @param userId
	 * @param pager
	 * @return
	 */
    List<UserAccountBill> findUserAccountBillByIncome(@Param("userId") String userId,
                                                      @Param("pager") Pageable pager);

	/** 获取所有用户收益账单
	 * @author fuxinlin
	 * @date 2016年5月4日上午10:41:12
	 * @param pager
	 * @return
	 */
    List<UserAccountBill> findAllUserAccountBillByIncome(@Param("pager") Pageable pager);

	/**
	 * 统计缴费成功用户人数
	 * @author fuxinlin
	 * @date 2016年5月12日上午10:58:46
	 * @param bidId
	 * @return
	 */
    int countUserAuctionDeposit(String bidId);
	
	
	/**
	 * 更新账单使用玉币
	 * @param @param billId
	 * @param @param jadeCurrency
	 * @author guohao
	 * @date 2016年7月11日 下午4:27:27
	 * @since $
	 */
    void updateUseJadeCurrency(@Param("billId") String billId, @Param("jadeCurrency") Long jadeCurrency);
	
	void insertBatchPayNum(BatchPayNum batchPayNum);

	BatchPayNum findBatchPayNumByBatchPayNum(String batchPayNum);

	/**
	 * 获取为成功，也未取消的记录分批记录。
	 * @author Gonzo
	 * @date 2016年11月2日下午7:05:27
	 * @param payNum
	 * @return
	 */
    List<BatchPayNum> findBatchPayNumsByPayNum(String payNum);
	/**
	 * 获取本次分批支付的次数，只有状态为1和10的时候，才是本次分批的记录，其他的成功了或者取消了都会被改为别的状态。取消过的被过滤掉了
	 * @author Gonzo
	 * @date 2016年11月4日上午10:30:01
	 * @return
	 */
    Integer findBatchPayCountByPayNum(String payNum);
	/**
	 * 获取成功的分批支付记录
	 * @author Gonzo
	 * @date 2016年11月2日下午7:05:20
	 * @param payNum
	 * @return
	 */
    List<BatchPayNum> findSuccessBatchPayNumsByPayNum(String payNum);
	
	/**
	 * 获取所有的分批记录，忽略状态
	 * @author Gonzo
	 * @date 2016年11月7日下午3:04:12
	 * @param payNum
	 * @return
	 */
    List<BatchPayNum> findAllBatchPayNumsByPayNum(String payNum);

	void updateBatchPayNum(BatchPayNum batchPayNum);
	
	/**
	 * 将父单号对应的支付成功的子单号的status 为10 的置为最终的完成状态30，和将状态为1的置为31
	 * @author Gonzo
	 * @date 2016年11月3日下午3:12:05
	 * @param orderNum
	 */
    void updatBatchStatusByPayNum(String orderNum);

	/**
	 * 获取用户未完成的分批支付，状态为1，则表示未支付成功，10表示当前这一份分批支付成功，但是总体还没有成功
	 * @author Gonzo
	 * @date 2016年11月4日下午5:27:14
	 * @param userId
	 * @return
	 */
    String findUserNotEndedBatchPayNum(String userId);

	void updateBatchPayNumStatus(BatchPayNum batchPayNum);
	/**
	 * 获取到分批记录的成功或者是取消的分批数量。
	 * @author Gonzo
	 * @date 2016年11月7日下午2:31:13
	 * @param payNum
	 * @return
	 */
    Integer findBatchPaySuccessOrCancelCountByPayNum(String payNum);
    
    List<UserAccountBillVO> list(@Param("pager") Pager<UserAccountBillVO> pager, @Param("uabf") UserAccountBillForm uabf);
    
    String getDes(String dn);
    
    void modifyDes(@Param("newDes") String newDes, @Param("dealNum") String dealNum);
   
}
